import os
from typing import List, Dict
from openai import OpenAI  # 确保已安装 openai 库（pip install openai）
# 导入之前实现的混合检索函数和向量生成依赖


from rag_test.hybrid_search import hybrid_search_labor_law


def get_labor_law_response(user_question: str) -> str:
    """
    用户输入问题后，判断劳动法意图→调用RAG检索→调用大模型生成回答

    参数:
        user_question: 用户输入的问题（如"未签劳动合同能要赔偿吗？"）

    返回:
        大模型生成的自然语言回答（含劳动法条依据）
    """

    # -------------------------- 第一步：判断用户意图（是否为劳动法相关） --------------------------
    # def is_labor_law_related(question: str) -> bool:
    #     """
    #     简单规则+关键词匹配判断意图，可根据需求扩展关键词库
    #     """
    #     # 劳动法核心关键词库（覆盖劳动合同、工资、补偿、离职等场景）
    #     labor_law_keywords = [
    #         "劳动合同", "劳动法", "工资", "薪酬", "加班", "加班费",
    #         "辞职", "离职", "解雇", "辞退", "经济补偿", "赔偿金",
    #         "试用期", "社保", "五险一金", "工伤", "工龄", "无固定期限",
    #         "未签合同", "双倍工资", "解除合同", "劳动仲裁", "劳动纠纷"
    #     ]
    #     # 转为小写统一匹配，降低敏感度
    #     question_lower = question.lower()
    #     # 若包含任意2个及以上关键词，判定为劳动法相关（可调整阈值）
    #     keyword_count = sum(1 for kw in labor_law_keywords if kw in question_lower)
    #     return keyword_count >= 1  # 含1个关键词即判定（根据实际需求调整）
    #
    # # 执行意图判断
    # if not is_labor_law_related(user_question):
    #     return "抱歉，目前仅支持劳动法相关问题的咨询（如劳动合同、工资补偿、离职纠纷等），请您补充具体劳动法相关需求~"

    # -------------------------- 第二步：调用RAG检索，获取相关法条 --------------------------
    try:
        # 调用混合检索函数，获取Top3相关法条（可调整top_k）
        rag_results = hybrid_search_labor_law(
            query_text=user_question,
            top_k=3,  # 返回3条最相关法条，平衡精度与回答长度
            filter_conditions=None  # 不限制章节，全量检索（需限定章节可添加条件）
        )

        print("混合检索rag_results:",rag_results)

        # 处理检索结果：格式化法条内容，作为大模型回答依据
        if not rag_results:
            legal_basis = "未检索到直接相关的劳动法条文，将基于通用劳动法原则回答："
        else:
            legal_basis = "根据《中华人民共和国劳动合同法》相关规定：\n"
            for idx, result in enumerate(rag_results, 1):
                metadata = result["metadata"]
                # 提取核心信息：法条号+标题+内容（截取前200字避免过长）
                article_info = (
                    f"{idx}. {metadata['article_num']}《{metadata['article_title']}》\n"
                    f"   内容：{metadata['content_clean']}...\n"
                )
                legal_basis += article_info

    except Exception as e:
        # 检索失败时降级：基于大模型通用知识回答，同时提示异常
        legal_basis = f"法条检索过程中出现小插曲（{str(e)[:50]}），将基于劳动法通用规则回答："

    # -------------------------- 第三步：调用大模型，生成最终回答 --------------------------
    def get_llm_completion(messages: List[Dict]) -> str:
        """封装大模型调用，复用您提供的客户端配置"""
        try:
            client = OpenAI(
                api_key=os.getenv("DASHSCOPE_API_KEY"),
                base_url="http://localhost:11434/v1",  # 本地模型服务地址
            )
            # 调用 qwen:latest 模型，设置温度控制回答随机性（0.3偏严谨）
            completion = client.chat.completions.create(
                model="qwen:latest",
                messages=messages,
                temperature=0.3,  # 法律回答需严谨，降低随机性
                max_tokens=1000  # 限制回答长度，避免冗余
            )
            # 提取模型回答内容
            return completion.choices[0].message.content.strip()
        except Exception as e:
            return f"回答生成失败：{str(e)[:80]}，请检查模型服务或API密钥是否正常~"

    # 构造大模型提示词（Prompt Engineering）：明确角色+基于法条+自然语言回答
    system_prompt = (
        "你是专业的劳动法咨询助手，需基于提供的法条依据，用通俗语言回答用户问题。"
        "要求：1. 先明确回答核心结论；2. 结合法条说明理由（标注法条号）；3. 避免专业术语堆砌，让非法律背景用户易懂；4. 若涉及赔偿/补偿，简要说明计算逻辑（如适用）。"
    )
    user_prompt = f"用户问题：{user_question}\n\n法条依据：{legal_basis}"

    print("system_prompt:",system_prompt)
    print("user_prompt:",user_prompt)

    # 构造 messages 格式（符合 OpenAI API 规范）
    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_prompt}
    ]

    # 调用大模型获取回答
    llm_answer = get_llm_completion(messages)

    # -------------------------- 第四步：返回最终结果 --------------------------
    return llm_answer


# -------------------------- 测试示例 --------------------------
if __name__ == "__main__":
    # 测试1：劳动法相关问题
    user_q1 = "未签劳动合同工作半年，被辞退能要多少赔偿？"
    print(f"用户问题：{user_q1}\n")
    print(f"助手回答：{get_labor_law_response(user_q1)}\n\n")

    # 测试2：非劳动法问题
    user_q2 = "如何申请发明专利？"
    print(f"用户问题：{user_q2}\n")
    print(f"助手回答：{get_labor_law_response(user_q2)}")